<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<!-- 
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements.  See the NOTICE file
distributed with this work for additional information
regarding copyright ownership.  The ASF licenses this file
to you under the Apache License, Version 2.0 (the
"License"); you may not use this file except in compliance
with the License.  You may obtain a copy of the License at

 http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing,
software distributed under the License is distributed on an
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, either express or implied.  See the License for the
specific language governing permissions and limitations
under the License. 
-->
<html>
<head>
    <link type="text/css" rel="stylesheet" href="https://struts.apache.org/css/default.css">
    <style type="text/css">
        .dp-highlighter {
            width:95% !important;
        }
    </style>
    <style type="text/css">
        .footer {
            background-image:      url('https://cwiki.apache.org/confluence/images/border/border_bottom.gif');
            background-repeat:     repeat-x;
            background-position:   left top;
            padding-top:           4px;
            color:                 #666;
        }
    </style>
    <script type="text/javascript" language="javascript">
        var hide = null;
        var show = null;
        var children = null;

        function init() {
            /* Search form initialization */
            var form = document.forms['search'];
            if (form != null) {
                form.elements['domains'].value = location.hostname;
                form.elements['sitesearch'].value = location.hostname;
            }

            /* Children initialization */
            hide = document.getElementById('hide');
            show = document.getElementById('show');
            children = document.all != null ?
                    document.all['children'] :
                    document.getElementById('children');
            if (children != null) {
                children.style.display = 'none';
                show.style.display = 'inline';
                hide.style.display = 'none';
            }
        }

        function showChildren() {
            children.style.display = 'block';
            show.style.display = 'none';
            hide.style.display = 'inline';
        }

        function hideChildren() {
            children.style.display = 'none';
            show.style.display = 'inline';
            hide.style.display = 'none';
        }
    </script>
    <title>Zero Configuration Scanning</title>
</head>
<body onload="init()">
<table border="0" cellpadding="2" cellspacing="0" width="100%">
    <tr class="topBar">
        <td align="left" valign="middle" class="topBarDiv" align="left" nowrap>
            &nbsp;<a href="home.html">Home</a>&nbsp;&gt;&nbsp;<a href="guides.html">Guides</a>&nbsp;&gt;&nbsp;<a href="contributors-guide.html">Contributors Guide</a>&nbsp;&gt;&nbsp;<a href="requirements.html">Requirements</a>&nbsp;&gt;&nbsp;<a href="use-cases.html">Use Cases</a>&nbsp;&gt;&nbsp;<a href="zero-configuration-scanning.html">Zero Configuration Scanning</a>
        </td>
        <td align="right" valign="middle" nowrap>
            <form name="search" action="https://www.google.com/search" method="get">
                <input type="hidden" name="ie" value="UTF-8" />
                <input type="hidden" name="oe" value="UTF-8" />
                <input type="hidden" name="domains" value="" />
                <input type="hidden" name="sitesearch" value="" />
                <input type="text" name="q" maxlength="255" value="" />
                <input type="submit" name="btnG" value="Google Search" />
            </form>
        </td>
    </tr>
</table>

<div id="PageContent">
    <div class="pageheader" style="padding: 6px 0px 0px 0px;">
        <!-- We'll enable this once we figure out how to access (and save) the logo resource -->
        <!--img src="/wiki/images/confluence_logo.gif" style="float: left; margin: 4px 4px 4px 10px;" border="0"-->
        <div style="margin: 0px 10px 0px 10px" class="smalltext">Apache Struts 2 Documentation</div>
        <div style="margin: 0px 10px 8px 10px"  class="pagetitle">Zero Configuration Scanning</div>

        <div class="greynavbar" align="right" style="padding: 2px 10px; margin: 0px;">
            <a href="https://cwiki.apache.org/confluence/pages/editpage.action?pageId=29371">
                <img src="https://cwiki.apache.org/confluence/images/icons/notep_16.gif"
                     height="16" width="16" border="0" align="absmiddle" title="Edit Page"></a>
            <a href="https://cwiki.apache.org/confluence/pages/editpage.action?pageId=29371">Edit Page</a>
            &nbsp;
            <a href="https://cwiki.apache.org/confluence/pages/listpages.action?key=WW">
                <img src="https://cwiki.apache.org/confluence/images/icons/browse_space.gif"
                     height="16" width="16" border="0" align="absmiddle" title="Browse Space"></a>
            <a href="https://cwiki.apache.org/confluence/pages/listpages.action?key=WW">Browse Space</a>
            &nbsp;
            <a href="https://cwiki.apache.org/confluence/pages/createpage.action?spaceKey=WW&fromPageId=29371">
                <img src="https://cwiki.apache.org/confluence/images/icons/add_page_16.gif"
                     height="16" width="16" border="0" align="absmiddle" title="Add Page"></a>
            <a href="https://cwiki.apache.org/confluence/pages/createpage.action?spaceKey=WW&fromPageId=29371">Add Page</a>
            &nbsp;
            <a href="https://cwiki.apache.org/confluence/pages/createblogpost.action?spaceKey=WW&fromPageId=29371">
                <img src="https://cwiki.apache.org/confluence/images/icons/add_blogentry_16.gif"
                     height="16" width="16" border="0" align="absmiddle" title="Add News"></a>
            <a href="https://cwiki.apache.org/confluence/pages/createblogpost.action?spaceKey=WW&fromPageId=29371">Add News</a>
        </div>
    </div>

    <div class="pagecontent">
        <div class="wiki-content">
            <div id="ConfluenceContent"><h2 id="ZeroConfigurationScanning-Narrative">Narrative</h2>

<blockquote>
<p>One of Zaphod's heads is allergic to XML. Rather than embed metadata in a configuration file, Zaphod annotates his POJO actions instead. The framework scans the designated packages for objects that implement Action or have names that end with "Action". An action mappings is automatically created and registered for each matching class, based on the annotations. </p></blockquote>

<h2 id="ZeroConfigurationScanning-Goal">Goal</h2>

<div class="table-wrap"><table class="confluenceTable"><tbody><tr><th colspan="1" rowspan="1" class="confluenceTh"><p>Goal </p></th><td colspan="1" rowspan="1" class="confluenceTd"><p>&#160;</p></td></tr><tr><th colspan="1" rowspan="1" class="confluenceTh"><p>Level </p></th><td colspan="1" rowspan="1" class="confluenceTd"><p>&#160;</p></td><td colspan="1" rowspan="1" class="confluenceTd"><p> (User Goal, Summary,  Subfunction) </p></td></tr><tr><th colspan="1" rowspan="1" class="confluenceTh"><p> Trigger </p></th><td colspan="1" rowspan="1" class="confluenceTd"><p>&#160;</p></td></tr><tr><th colspan="1" rowspan="1" class="confluenceTh"><p>Primary Actor </p></th><td colspan="1" rowspan="1" class="confluenceTd"><p>&#160;</p></td></tr></tbody></table></div>


<h2 id="ZeroConfigurationScanning-MainSuccessScenario(MSS)">Main Success Scenario (MSS)</h2>

<div class="table-wrap"><table class="confluenceTable"><tbody><tr><th colspan="1" rowspan="1" class="confluenceTh"><p> Step </p></th><th colspan="1" rowspan="1" class="confluenceTh"><p> Action </p></th></tr><tr><th colspan="1" rowspan="1" class="confluenceTh"><p>1 </p></th><td colspan="1" rowspan="1" class="confluenceTd"><p> System loads FilterDispatcher through web.xml, which includes actionPackages parameter</p></td></tr><tr><th colspan="1" rowspan="1" class="confluenceTh"><p>2 </p></th><td colspan="1" rowspan="1" class="confluenceTd"><p> FilterDispatcher initializes a Dispatcher, passing along the actionPackages parameter</p></td></tr><tr><th colspan="1" rowspan="1" class="confluenceTh"><p>3 </p></th><td colspan="1" rowspan="1" class="confluenceTd"><p> Dispatcher initializes ClasspathConfigurationProvider to hold one or more Configuration Providers</p></td></tr><tr><th colspan="1" rowspan="1" class="confluenceTh"><p>4 </p></th><td colspan="1" rowspan="1" class="confluenceTd"><p> Dispatcher adds to the ConfigurationManager object a ClasspathConfigurationProvider to process the actionPackages.</p></td></tr><tr><th colspan="1" rowspan="1" class="confluenceTh"><p>5 </p></th><td colspan="1" rowspan="1" class="confluenceTd"><p> (someone) calls loadpackages on ClasspathConfigurationProvider</p></td></tr><tr><th colspan="1" rowspan="1" class="confluenceTh"><p>6 </p></th><td colspan="1" rowspan="1" class="confluenceTd"><p> loadpackages utilizes the XWork ResolverUtil to find classes that implement Action or have names suffixed with "Action" in the listed packages. Each found class is added to a set (if not already present), and each class in the set is passed to the processActionClass helper method.</p></td></tr><tr><th colspan="1" rowspan="1" class="confluenceTh"><p>7 </p></th><td colspan="1" rowspan="1" class="confluenceTd"><p> processActionClass ascertains the namespace, captures any ParentPackage or Results annotations, and creates an ActionConfig, setting the action name, package name, and results.</p></td></tr></tbody></table></div>


<h2 id="ZeroConfigurationScanning-Extensions">Extensions</h2>

<div class="table-wrap"><table class="confluenceTable"><tbody><tr><th colspan="1" rowspan="1" class="confluenceTh"><p> Step </p></th><th colspan="1" rowspan="1" class="confluenceTh"><p> Branching Action </p></th></tr><tr><td colspan="1" rowspan="1" class="confluenceTd"><p>&#160;</p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>&#160;</p></td></tr><tr><th colspan="1" rowspan="1" class="confluenceTh"><p> 7a </p></th><th colspan="1" rowspan="1" class="confluenceTh"><p> Action suffix </p></th></tr><tr><td colspan="1" rowspan="1" class="confluenceTd"><p> .1 </p></td><td colspan="1" rowspan="1" class="confluenceTd"><p> The action name is truncated before any Action suffix. </p></td></tr><tr><td colspan="1" rowspan="1" class="confluenceTd"><p>&#160;</p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>&#160;</p></td></tr><tr><th colspan="1" rowspan="1" class="confluenceTh"><p> 7b </p></th><th colspan="1" rowspan="1" class="confluenceTh"><p> Embedded / </p></th></tr><tr><td colspan="1" rowspan="1" class="confluenceTd"><p> .1 </p></td><td colspan="1" rowspan="1" class="confluenceTd"><p> If action name contains a / character, then the first character after the last / is forced to lowercase. </p></td></tr><tr><td colspan="1" rowspan="1" class="confluenceTd"><p>&#160;</p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>&#160;</p></td></tr><tr><th colspan="1" rowspan="1" class="confluenceTh"><p> 7c </p></th><th colspan="1" rowspan="1" class="confluenceTh"><p> On the fly results  </p></th></tr><tr><td colspan="1" rowspan="1" class="confluenceTd"><p> .1 </p></td><td colspan="1" rowspan="1" class="confluenceTd"><p> Results are wrapped in a ResultMap class that processes the Action class annotations on initialization, creating any new result configuration objects as needed.</p></td></tr></tbody></table></div>


<hr>

<h2 id="ZeroConfigurationScanning-PreconditionsandGuarantees">Preconditions and Guarantees</h2>

<div class="table-wrap"><table class="confluenceTable"><tbody><tr><th colspan="1" rowspan="1" class="confluenceTh"><p> Preconditions </p></th><td colspan="1" rowspan="1" class="confluenceTd"><p>&#160;</p></td></tr><tr><th colspan="1" rowspan="1" class="confluenceTh"><p> Minimal Guarantees </p></th><td colspan="1" rowspan="1" class="confluenceTd"><p>&#160;</p></td></tr><tr><th colspan="1" rowspan="1" class="confluenceTh"><p> Success Guarantees </p></th><td colspan="1" rowspan="1" class="confluenceTd"><p>&#160;</p></td></tr></tbody></table></div>


<h2 id="ZeroConfigurationScanning-StakeholdersandInterests">Stakeholders and Interests</h2>

<div class="table-wrap"><table class="confluenceTable"><tbody><tr><th colspan="1" rowspan="1" class="confluenceTh"><p> Stakeholder </p></th><th colspan="1" rowspan="1" class="confluenceTh"><p> Interest </p></th></tr><tr><td colspan="1" rowspan="1" class="confluenceTd"><p>&#160;</p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>&#160;</p></td></tr></tbody></table></div>


<h2 id="ZeroConfigurationScanning-Variations">Variations </h2>

<div class="table-wrap"><table class="confluenceTable"><tbody><tr><th colspan="1" rowspan="1" class="confluenceTh"><p> Step </p></th><th colspan="1" rowspan="1" class="confluenceTh"><p> Variation </p></th></tr><tr><th colspan="1" rowspan="1" class="confluenceTh"><p>&#160;</p></th><td colspan="1" rowspan="1" class="confluenceTd"><p>&#160;</p></td></tr></tbody></table></div>


</div>
        </div>

        
    </div>
</div>
<div class="footer">
    Generated by CXF SiteExporter
</div>
</body>
</html>
